package com.luxsoft.siipap.migracion;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.springframework.util.Assert;

import com.luxsoft.siipap.em.replica.importadores.ImportadorSupport;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;
import com.luxsoft.siipap.util.DateUtil;
import com.luxsoft.siipap.ventas.model.ListaDePreciosCliente;
import com.luxsoft.siipap.ventas.model.ListaDePreciosClienteDet;

public class ImportadorPreciosPorCliente extends ImportadorGeneral{
	
	
	public void importar(){
		String sql="select distinct b.clave " +
				" from SW_DESC_CTE a join SW_CLIENTES b on(a.CLIENTE_ID=b.CLIENTE_ID) " +
				" where  tipo='A' order by b.clave";
		List<String> clientes=ServiceLocator2.getAnalisisJdbcTemplate().queryForList(sql, String.class);
		for(String cliente:clientes){
			try {
				importar(cliente);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
	}
	
	private List<Map<String, Object>> fijos;
	
	public void buscarDescuentosFijo(final ListaDePreciosCliente lp) {
		if(fijos==null){
			String sql = "select b.clave as CLIENTE ,a.*  from SW_DESC_CTE a  join SW_CLIENTES b on(a.CLIENTE_ID=b.CLIENTE_ID)  where  a.tipo<>\'A\' order by b.clave";
			fijos = ServiceLocator2.getAnalisisJdbcTemplate().queryForList(sql);
		}
		Map<String,Object> found=(Map<String, Object>)CollectionUtils.find(fijos, new Predicate(){

			public boolean evaluate(Object input) {
				Map<String,Object> row=(Map<String, Object>)input;
				boolean res=row.get("CLIENTE").equals(lp.getCliente().getClave());
				if(res)
					System.out.println("\tDescuento fijo :"+row);
				return res;
			}
			
		});
		if(found!=null){
			Number descuento=(Number)found.get("DESCUENTO");
			lp.setDescuento(descuento.doubleValue());
		}
	}
	
	private void importar(String cliente){
		String sql="select c.clave as PRODUCTO,a.* " +
				" from SW_DESC_CTE a " +
				" join SW_CLIENTES b on(a.CLIENTE_ID=b.CLIENTE_ID) " +
				" join SW_ARTICULOS c on(a.ARTICULO_ID=c.ID) " +
				" where  a.tipo='A' " +
				"  and b.clave=? " +
				" order by b.clave";
		List<Map<String,Object>> data=ServiceLocator2.getAnalisisJdbcTemplate().queryForList(sql, new String[]{cliente});
		if(data.isEmpty()) return;
		
		ListaDePreciosCliente l=new ListaDePreciosCliente();
		l.setCliente(ImportadorSupport.getInstance().buscarCliente(cliente));
		Assert.notNull(l.getCliente(),"No existe en MySQL el cliente: "+cliente);
		l.setActivo(true);
		l.setComentario("List importada: "+DateUtil.convertDateToString(new Date()));
		l.setFechaInicial(new Date());
		l.setFechaFinal(DateUtil.toDate("31/03/2009"));
		buscarDescuentosFijo(l);
		for(Map<String, Object> row:data){
			ListaDePreciosClienteDet det=new ListaDePreciosClienteDet();
			String prodClave=(String)row.get("PRODUCTO");
			det.setProducto(ImportadorSupport.getInstance().buscarProducto(prodClave));
			BigDecimal pkilo=(BigDecimal)row.get("PRECIOK");
			det.setPrecioKilo(pkilo.doubleValue());
			det.setMoneda(CantidadMonetaria.PESOS);
			BigDecimal desc=(BigDecimal)row.get("DESCUENTO");
			det.setDescuento(desc.doubleValue());
			det.setDescripcion(l.getComentario());
			l.agregarPrecio(det);
		}
		ServiceLocator2.getCXCManager().salvarLista(l);
		System.out.println("Lista por persistir: "+l+ "Precios: "+l.getPrecios().size());
	}
	
	public static void main(String[] args) {
		DBUtils.whereWeAre();
		new ImportadorPreciosPorCliente().importar();
	}

}
